home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 14 / CU Amiga Magazine's Super CD-ROM 14 (1997)(EMAP Images)(GB)(Track 1 of 3)[!][issue 1997-09].iso / CUCD / Programming / Mesa-2.2 / demos / isosurf.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-01-29  |  6.0 KB  |  304 lines

  1. /* isosurf.c */
  2.  
  3. /*
  4.  * Mesa 2.0 version
  5.  *
  6.  * Display an isosurface of 3-D wind speed volume.  Use arrow keys to
  7.  * rotate, S toggles smooth shading, L toggles lighting
  8.  * Brian Paul
  9.  */
  10.  
  11.  
  12.  
  13.  
  14. #include <stdio.h>
  15. #include <string.h>
  16. #include <stdlib.h>
  17. #include <math.h>
  18. #include "gltk.h"
  19.  
  20.  
  21. GLboolean speed_test = GL_FALSE;
  22. GLboolean use_vertex_arrays = GL_FALSE;
  23.  
  24. GLboolean doubleBuffer = GL_TRUE;
  25.  
  26. GLboolean smooth = GL_TRUE;
  27. GLboolean lighting = GL_TRUE;
  28.  
  29.  
  30.  
  31. #define MAXVERTS 10000
  32.  
  33. static GLfloat verts[MAXVERTS][3];
  34. static GLfloat norms[MAXVERTS][3];
  35. static GLint numverts;
  36.  
  37. static GLfloat xrot;
  38. static GLfloat yrot;
  39.  
  40.  
  41.  
  42. static void read_surface( char *filename )
  43. {
  44.    FILE *f;
  45.  
  46.    f = fopen(filename,"r");
  47.    if (!f) {
  48.       printf("couldn't read %s\n", filename);
  49.       exit(1);
  50.    }
  51.  
  52.    numverts = 0;
  53.    while (!feof(f) && numverts<MAXVERTS) {
  54.       fscanf( f, "%f %f %f  %f %f %f",
  55.           &verts[numverts][0], &verts[numverts][1], &verts[numverts][2],
  56.           &norms[numverts][0], &norms[numverts][1], &norms[numverts][2] );
  57.       numverts++;
  58.    }
  59.    numverts--;
  60.  
  61.    printf("%d vertices, %d triangles\n", numverts, numverts-2);
  62.    fclose(f);
  63. }
  64.  
  65.  
  66.  
  67. static void draw_surface( void )
  68. {
  69.    GLuint i;
  70.  
  71. #ifdef GL_EXT_vertex_array
  72.    if (use_vertex_arrays) {
  73.       glDrawArraysEXT( GL_TRIANGLE_STRIP, 0, numverts );
  74.    }
  75.    else {
  76. #endif
  77.       glBegin( GL_TRIANGLE_STRIP );
  78.       for (i=0;i<numverts;i++) {
  79.          glNormal3fv( norms[i] );
  80.          glVertex3fv( verts[i] );
  81.       }
  82.       glEnd();
  83. #ifdef GL_EXT_vertex_array
  84.    }
  85. #endif
  86. }
  87.  
  88.  
  89.  
  90. static void draw1(void)
  91. {
  92.     glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
  93.     glPushMatrix();
  94.     glRotatef( yrot, 0.0, 1.0, 0.0 );
  95.     glRotatef( xrot, 1.0, 0.0, 0.0 );
  96.  
  97.     draw_surface();
  98.  
  99.     glPopMatrix();
  100.  
  101.     glFlush();
  102.     if (doubleBuffer) {
  103.     tkSwapBuffers();
  104.     }
  105. }
  106.  
  107.  
  108. static void draw(void)
  109. {
  110.    if (speed_test) {
  111.       for (xrot=0.0;xrot<=360.0;xrot+=10.0) {
  112.      draw1();
  113.       }
  114.       tkQuit();
  115.    }
  116.    else {
  117.       draw1();
  118.    }
  119. }
  120.  
  121.  
  122.  
  123. static void InitMaterials(void)
  124. {
  125.     static float ambient[] = {0.1, 0.1, 0.1, 1.0};
  126.     static float diffuse[] = {0.5, 1.0, 1.0, 1.0};
  127.     static float position0[] = {0.0, 0.0, 20.0, 0.0};
  128.     static float position1[] = {0.0, 0.0, -20.0, 0.0};
  129.     static float front_mat_shininess[] = {60.0};
  130.     static float front_mat_specular[] = {0.2, 0.2, 0.2, 1.0};
  131.     static float front_mat_diffuse[] = {0.5, 0.28, 0.38, 1.0};
  132.     /*
  133.     static float back_mat_shininess[] = {60.0};
  134.     static float back_mat_specular[] = {0.5, 0.5, 0.2, 1.0};
  135.     static float back_mat_diffuse[] = {1.0, 1.0, 0.2, 1.0};
  136.     */
  137.     static float lmodel_ambient[] = {1.0, 1.0, 1.0, 1.0};
  138.     static float lmodel_twoside[] = {GL_FALSE};
  139.  
  140.     glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
  141.     glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
  142.     glLightfv(GL_LIGHT0, GL_POSITION, position0);
  143.     glEnable(GL_LIGHT0);
  144.     
  145.     glLightfv(GL_LIGHT1, GL_AMBIENT, ambient);
  146.     glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse);
  147.     glLightfv(GL_LIGHT1, GL_POSITION, position1);
  148.     glEnable(GL_LIGHT1);
  149.     
  150.     glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
  151.     glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside);
  152.     glEnable(GL_LIGHTING);
  153.  
  154.     glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, front_mat_shininess);
  155.     glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, front_mat_specular);
  156.     glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, front_mat_diffuse);
  157. }
  158.  
  159.  
  160. static void Init(void)
  161. {
  162.    glClearColor(0.0, 0.0, 0.0, 0.0);
  163.  
  164.    glShadeModel(GL_SMOOTH);
  165.    glEnable(GL_DEPTH_TEST);
  166.  
  167.    InitMaterials();
  168.  
  169.    glMatrixMode(GL_PROJECTION);
  170.    glLoadIdentity();
  171.    glFrustum( -1.0, 1.0, -1.0, 1.0, 5, 25 );
  172.  
  173.    glMatrixMode(GL_MODELVIEW);
  174.    glLoadIdentity();
  175.    glTranslatef( 0.0, 0.0, -6.0 );
  176.  
  177. #ifdef GL_EXT_vertex_array
  178.    if (use_vertex_arrays) {
  179.       glVertexPointerEXT( 3, GL_FLOAT, 0, numverts, verts );
  180.       glNormalPointerEXT( GL_FLOAT, 0, numverts, norms );
  181.       glEnable( GL_VERTEX_ARRAY_EXT );
  182.       glEnable( GL_NORMAL_ARRAY_EXT );
  183.    }
  184. #endif
  185. }
  186.  
  187.  
  188.  
  189. static void Reshape(int width, int height)
  190. {
  191.     glViewport(0, 0, (GLint)width, (GLint)height);
  192. }
  193.  
  194.  
  195.  
  196. static GLenum Key(int key, GLenum mask)
  197. {
  198.     switch (key) {
  199.       case TK_ESCAPE:
  200.     tkQuit();
  201.       case TK_LEFT:
  202.     yrot -= 15.0;
  203.     break;
  204.       case TK_RIGHT:
  205.     yrot += 15.0;
  206.     break;
  207.       case TK_UP:
  208.     xrot += 15.0;
  209.     break;
  210.       case TK_DOWN:
  211.     xrot -= 15.0;
  212.     break;
  213.       case TK_s:
  214.     smooth = !smooth;
  215.     if (smooth) {
  216.         glShadeModel(GL_SMOOTH);
  217.     } else {
  218.         glShadeModel(GL_FLAT);
  219.     }
  220.     break;
  221.       case TK_l:
  222.     lighting = !lighting;
  223.     if (lighting) {
  224.         glEnable(GL_LIGHTING);
  225.     } else {
  226.         glDisable(GL_LIGHTING);
  227.     }
  228.     break;
  229.       default:
  230.     return GL_FALSE;
  231.     }
  232.     return GL_TRUE;
  233. }
  234.  
  235.  
  236.  
  237. static GLenum Args(int argc, char **argv)
  238. {
  239.    GLint i;
  240.  
  241.    for (i = 1; i < argc; i++) {
  242.       if (strcmp(argv[i], "-sb") == 0) {
  243.          doubleBuffer = GL_FALSE;
  244.       }
  245.       else if (strcmp(argv[i], "-db") == 0) {
  246.          doubleBuffer = GL_TRUE;
  247.       }
  248.       else if (strcmp(argv[i], "-speed") == 0) {
  249.          speed_test = GL_TRUE;
  250.          doubleBuffer = GL_TRUE;
  251.       }
  252.       else if (strcmp(argv[i], "-va") == 0) {
  253.          use_vertex_arrays = GL_TRUE;
  254.       }
  255.       else {
  256.          printf("%s (Bad option).\n", argv[i]);
  257.          return GL_FALSE;
  258.       }
  259.    }
  260.  
  261.    return GL_TRUE;
  262. }
  263.  
  264.  
  265.  
  266. void main(int argc, char **argv)
  267. {
  268.    GLenum type;
  269.    char *extensions;
  270.  
  271.    read_surface( "isosurf.dat" );
  272.  
  273.    if (Args(argc, argv) == GL_FALSE) {
  274.       tkQuit();
  275.    }
  276.  
  277.    tkInitPosition(0, 0, 400, 400);
  278. /*   tkInitPosition(0, 0, 800, 800); */
  279.    
  280.    type = TK_DEPTH;
  281.    type |= TK_RGB;
  282.    type |= TK_DIRECT;
  283.    type |= (doubleBuffer) ? TK_DOUBLE : TK_SINGLE;
  284.    tkInitDisplayMode(type);
  285.  
  286.    if (tkInitWindow("Isosurface") == GL_FALSE) {
  287.       tkQuit();
  288.    }
  289.  
  290.    /* Make sure server supports the vertex array extension */
  291.    extensions = (char *) glGetString( GL_EXTENSIONS );
  292.    if (!strstr( extensions, "GL_EXT_vertex_array" )) {
  293.       use_vertex_arrays = GL_FALSE;
  294.    }
  295.  
  296.    Init();
  297.  
  298.    tkExposeFunc(Reshape);
  299.    tkReshapeFunc(Reshape);
  300.    tkKeyDownFunc(Key);
  301.    tkDisplayFunc( draw );
  302.    tkExec();
  303. }
  304.